package core

import (
	"sync"
	"go-iot/app/common/logger"
)

// 编解码接口
type Codec interface {
	// 设备连接
	OnConnect(ctx MessageContext) error
	// 接收消息
	OnMessage(ctx MessageContext) error
	// 命令调用
	OnInvoke(ctx FuncInvokeContext) error
	// 连接关闭
	OnClose(ctx MessageContext) error
}

// 脚本编解码
const Script_Codec = "script_codec"

// codec reg
var codecMap sync.Map
var codecFactory = map[string]func(productId, script string) (Codec, error){}

func GetCodec(productId string) Codec {
	val, ok := codecMap.Load(productId)
	if val != nil && ok {
		c := val.(Codec)
		return c
	}
	return nil
}


func NewCodec(codecId, productId, script string) (Codec, error) {
	c, err := codecFactory[codecId](productId, script)
	return c, err
}

// 注册编解码器
func RegCodec(productId string, c Codec) {
	codecMap.Store(productId, c)
}

func RegCodecCreator(codecId string, creator func(productId, script string) (Codec, error)) {
	_, ok := codecFactory[codecId]
	if ok {
		logger.Errorf("core %s is exist", codecId)
		return
	}
	codecFactory[codecId] = creator
}
